package com.ushine.web.component.mybatis.decryption;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.springframework.stereotype.Component;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @Author: yls
 * @Date 2022/2/11 15:17
 * @Description: 字段存储层自动加密解密处理器
 * //此接口作用是用于指定jdbc与java的数据类型间对应关系处理。
 * public interface TypeHandler<T> {
 * // 保存操作，数据入库之前时数据处理
 * void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
 * //下面三个则是，从数据库加载数据后，vo对象封装前的数据处理
 * T getResult(ResultSet rs, String columnName) throws SQLException;
 * T getResult(ResultSet rs, int columnIndex) throws SQLException;
 * T getResult(CallableStatement cs, int columnIndex) throws SQLException;
 * }
 * @Version 1.0
 **/
@Component
@Slf4j
public class AesTypeHandler extends BaseTypeHandler<String> {
    /**
     * 功能描述:
     * 〈 非空字段加密 〉
     *
     * @param preparedStatement 执行器
     * @param i                 下标
     * @param s                 字符串
     * @param jdbcType          jdbc类型
     * @return : void
     * @author : yls
     * @date : 2022/2/11 16:11
     */
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, AesUtils.encrypt(s));
    }

    /**
     * 功能描述:
     * 〈非空字段解密〉
     *
     * @param resultSet 结果集
     * @param s         内容
     * @return : java.lang.String
     * @author : yls
     * @date : 2022/2/11 16:12
     */
    @Override
    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
        String string = resultSet.getString(s);
        if (StringUtils.isBlank(string)) {
            return string;
        }
        return AesUtils.decrypt(string);
    }

    /**
     * 功能描述:
     * 〈 可空字段解密 〉
     *
     * @param resultSet 结果集
     * @param i         下标
     * @return : java.lang.String
     * @author : yls
     * @date : 2022/2/11 16:14
     */
    @Override
    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
        String string = resultSet.getString(i);
        if (StringUtils.isBlank(string)) {
            return string;
        }
        return AesUtils.decrypt(string);
    }

    /**
     * 功能描述:
     * 〈 可空字段解密 〉
     *
     * @param callableStatement 结果集
     * @param i                 下标
     * @return : java.lang.String
     * @author : yls
     * @date : 2022/2/11 16:14
     */
    @Override
    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        String string = callableStatement.getString(i);
        if (StringUtils.isBlank(string)) {
            return string;
        }
        return AesUtils.decrypt(string);
    }
}
